/*
 * Copyright (c) China Telecom Cloud Technology Co., Ltd. 2024-2025. All rights reserved.
 */
#ifndef KVC_BASE_DEFINE_H
#define KVC_BASE_DEFINE_H

#include <stdint.h>
#include <cstring>
#include <algorithm>
#include <cstring>


// TODO: 新版本只对大爷对其=
#define PAGE_SIZE      (4096)      // 4KB
#define HUGE_PAGE_SIZE (2097152)   // 2MB

// size 的下一个整数倍值
#define ROUND_UP(val, size) (((val) + ((size)-1)) & (~((size)-1)))

// TODO(yangxianpku: 2025.08.21): 此部分设置项目未使用
// #define INVALID_MEMADDR    ((void *)-1)    // 无效地址
// #define INVALID_OFFSET     (0xFFFFFFFF)    // 无效偏移
// #define INVALID_SEGMENT_ID (0xFFFFFFFF)    // 无效segmentId 


// TODO(yangxianpku: 2025.08.21): 此部分设置项目未使用
// max support share memory = 2048 * 32 bit * 1 MB/bit = 64GB
// #define BITMAP_SIZE           (2048)
// #define BIT_LEN               (32)
// #define ALL_SEGMENT_ALLOCATED (0xFFFFFFFF)


//! gRPC Server端启动时设置
#define KVC_GRPC_MAX_RECV_MSG_SIZE (64 * 1024 * 1024)  // gRPC默认最大接收64MB
#define KVC_GRPC_MAX_SEND_MSG_SIZE (64 * 1024 * 1024)  // gRPC默认最大发送64MB
#define KVC_GRPC_MAX_CONCURRENT_STREAMS (1000)         // gRPC最大并发流数，用于控制同时处理的请求数量


// TODO(yangxianpku: 2025.08.21): 此部分设置项目未使用
// #define SET_BIT(val, n)   ((val) = (val) & (1 << (n)))  // 仅第n位有效
// #define CLEAR_BIT(val, n) ((val) = (val) & ~(1 << (n))) // 仅第n位无效
// #define TEST_BIT(val, n)  (((val) & (1 << (n))) != 0)   // 第n位是否为0

#define VERIFY_HASH_LENGTH (16)                            // segment备用哈希的长度

#define FILE_NAME_SEPARATOR "_"

/**
 *! @brief KV Memory分配策略(驱逐)
 * 
 */
// TODO(yangxianpku: 2025.08.21):  使用`class enum`形式, 移除typedef模式
typedef enum { 
    ALLOC_POLICY_DEFAULT = 0,  // 默认不驱逐
    ALLOC_POLICY_LRU, 
    ALLOC_POLICY_BUTT 
} AllocPolicy;


/**
 *! @brief KV Cache元数据信息
 * 
 */
// TODO(yangxianpku: 2025.08.21): 移除typedef模式
typedef struct {
    int32_t startLayer;       // 当前PP的起始层号(包含)
    int32_t endLayer;         // 当前PP的结束层号(不包含)
    int32_t layerNum;         // 模型总层数 
    int32_t layerCacheSize;   // 单层KV Cache大小(字节数)，考虑TP和PP在内
} CacheInfo;




/**
 *! @brief Segment相关哈希信息, Segment对标LMCache的CHUNK
 * 
 */
// TODO(yangxianpku: 2025.08.21): 移除typedef模式, 建议改名为SegmentHashId
typedef struct tagBlockHashId {
    int64_t  hashId;       // 块哈希(含前块信息，对标LMCahce的前缀哈希) 
    int64_t  parentHashId; // 前块前缀哈希
    uint64_t localHashId;  // 块哈希(仅当前块)，dynamo使用该数据精度

    // 当前块冲突时的备用哈希
    // TODO(yangxianpku: 2025.08.18): 为什么是16bytes
    char verifyHashId[VERIFY_HASH_LENGTH];

    tagBlockHashId(int64_t eId, int64_t peId = 0, 
        uint64_t lId = 0, const char *vId = nullptr)
        : hashId(eId), parentHashId(peId), localHashId(lId)
    {
        if (vId == nullptr) {
            // 全部填充0
            // TODO(yangxianpku: 2025.08.21):  默认会填充0
            std::fill(verifyHashId, verifyHashId + VERIFY_HASH_LENGTH, 0);
        } else {
            // 不为空则将vId拷贝至verifyHashId中
            std::copy(vId, vId + VERIFY_HASH_LENGTH, verifyHashId);
        }
    };

    tagBlockHashId() : hashId(0), parentHashId(0), localHashId(0) {
        // TODO(yangxianpku: 2025.08.21):  默认会填充0
        std::fill(verifyHashId, verifyHashId + VERIFY_HASH_LENGTH, 0);
    };


    // 使用默认的拷贝、赋值、移动构造函数， 析构函数
    tagBlockHashId(const tagBlockHashId&)            = default;
    tagBlockHashId(tagBlockHashId&&)                 = default;

    tagBlockHashId& operator=(const tagBlockHashId&) = default;
    tagBlockHashId& operator=(tagBlockHashId&&)      = default;

    ~tagBlockHashId()                                = default;
} BlockHashId;




/**
 *! @brief 模型运行的设备类型
 * 
 */
// TODO(yangxianpku: 2025.08.21):  使用`class enum`形式, 移除typedef模式
typedef enum { 
    DEVICE_TYPE_CPU,
    DEVICE_TYPE_GPU, 
    DEVICE_TYPE_NPU, 
    DEVICE_TYPE_BUTT
} DeviceType;


#endif  // KVC_BASE_DEFINE_H